GtkStatusbar: Define children with a GtkBuilder template
authorTristan Van Berkom <tristanvb@openismus.com>
Sat, 23 Mar 2013 11:38:43 +0000 (20:38 +0900)
committerTristan Van Berkom <tristanvb@openismus.com>
Mon, 8 Apr 2013 12:19:28 +0000 (21:19 +0900)
gtk/Makefile.am
gtk/gtk.gresource.xml
gtk/gtkstatusbar.c
gtk/gtkstatusbar.ui [new file with mode: 0644]
gtk/tests/templates.c

index 1e375aff794e1c830546b015d23f9e523335dcf8..b6804871948a1767d319b068eb2dec722dc48b49 100644 (file)
@@ -1102,7 +1102,8 @@ COMPOSITE_TEMPLATES =                     \
        gtkinfobar.ui                   \
        gtklockbutton.ui                \
        gtkmessagedialog.ui             \
-       gtkscalebutton.ui
+       gtkscalebutton.ui               \
+       gtkstatusbar.ui
 
 #
 # rules to generate built sources
index 856b450c5346d7884b48fd9819ed701f45268a77..79b269cd7f8c71ee27c92363edd96bd44ee4df5d 100644 (file)
@@ -18,5 +18,6 @@
     <file compressed="true">gtklockbutton.ui</file>
     <file compressed="true">gtkmessagedialog.ui</file>
     <file compressed="true">gtkscalebutton.ui</file>
+    <file compressed="true">gtkstatusbar.ui</file>
   </gresource>
 </gresources>
index 47350376ad2cbe885e0c107f983abb09f326339e..f5398b9ccefc6f8ca52f599e1ef9398c84c19703 100644 (file)
@@ -34,7 +34,6 @@
 #include "gtkwindow.h"
 #include "gtkprivate.h"
 #include "gtkintl.h"
-#include "gtkbuildable.h"
 #include "gtkorientable.h"
 #include "gtktypebuiltins.h"
 #include "a11y/gtkstatusbaraccessible.h"
@@ -80,6 +79,7 @@ struct _GtkStatusbarPrivate
 {
   GtkWidget     *frame;
   GtkWidget     *label;
+  GtkWidget     *message_area;
 
   GSList        *messages;
   GSList        *keys;
@@ -103,10 +103,6 @@ enum
   SIGNAL_LAST
 };
 
-static void     gtk_statusbar_buildable_interface_init    (GtkBuildableIface *iface);
-static GObject *gtk_statusbar_buildable_get_internal_child (GtkBuildable *buildable,
-                                                            GtkBuilder   *builder,
-                                                            const gchar  *childname);
 static void     gtk_statusbar_update            (GtkStatusbar      *statusbar,
                                                 guint              context_id,
                                                 const gchar       *text);
@@ -120,16 +116,12 @@ static void     gtk_statusbar_hierarchy_changed (GtkWidget         *widget,
 
 static guint              statusbar_signals[SIGNAL_LAST] = { 0 };
 
-G_DEFINE_TYPE_WITH_CODE (GtkStatusbar, gtk_statusbar, GTK_TYPE_BOX,
-                         G_IMPLEMENT_INTERFACE (GTK_TYPE_BUILDABLE,
-                                                gtk_statusbar_buildable_interface_init));
+G_DEFINE_TYPE (GtkStatusbar, gtk_statusbar, GTK_TYPE_BOX);
 
 static void
 gtk_statusbar_class_init (GtkStatusbarClass *class)
 {
-  GtkWidgetClass *widget_class;
-
-  widget_class = (GtkWidgetClass *) class;
+  GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
 
   widget_class->realize = gtk_statusbar_realize;
   widget_class->destroy = gtk_statusbar_destroy;
@@ -185,17 +177,22 @@ gtk_statusbar_class_init (GtkStatusbarClass *class)
                                                               GTK_SHADOW_IN,
                                                               GTK_PARAM_READABLE));
 
-   g_type_class_add_private (class, sizeof (GtkStatusbarPrivate));
+  /* Bind class to template
+   */
+  gtk_widget_class_set_template_from_resource (widget_class, "/org/gtk/libgtk/gtkstatusbar.ui");
+  gtk_widget_class_bind_child_internal (widget_class, GtkStatusbarPrivate, message_area);
+  gtk_widget_class_bind_child (widget_class, GtkStatusbarPrivate, frame);
+  gtk_widget_class_bind_child (widget_class, GtkStatusbarPrivate, label);
+
+  g_type_class_add_private (class, sizeof (GtkStatusbarPrivate));
 
-   gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_STATUSBAR_ACCESSIBLE);
+  gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_STATUSBAR_ACCESSIBLE);
 }
 
 static void
 gtk_statusbar_init (GtkStatusbar *statusbar)
 {
   GtkStatusbarPrivate *priv;
-  GtkBox *box = GTK_BOX (statusbar);
-  GtkWidget *message_area;
   GtkShadowType shadow_type;
 
   statusbar->priv = G_TYPE_INSTANCE_GET_PRIVATE (statusbar,
@@ -203,59 +200,16 @@ gtk_statusbar_init (GtkStatusbar *statusbar)
                                                  GtkStatusbarPrivate);
   priv = statusbar->priv;
 
-  gtk_widget_set_redraw_on_allocate (GTK_WIDGET (box), TRUE);
-
-  gtk_box_set_spacing (box, 2);
-  gtk_box_set_homogeneous (box, FALSE);
-
-  gtk_widget_style_get (GTK_WIDGET (statusbar), "shadow-type", &shadow_type, NULL);
-
-  priv->frame = gtk_frame_new (NULL);
-  gtk_frame_set_shadow_type (GTK_FRAME (priv->frame), shadow_type);
-  gtk_box_pack_start (box, priv->frame, TRUE, TRUE, 0);
-  gtk_widget_show (priv->frame);
-
-  message_area = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 4);
-  gtk_container_add (GTK_CONTAINER (priv->frame), message_area);
-  gtk_widget_show (message_area);
-
-  priv->label = gtk_label_new ("");
-  gtk_label_set_single_line_mode (GTK_LABEL (priv->label), TRUE);
-  gtk_widget_set_halign (priv->label, GTK_ALIGN_START);
-  gtk_widget_set_valign (priv->label, GTK_ALIGN_CENTER);
-  gtk_label_set_ellipsize (GTK_LABEL (priv->label), PANGO_ELLIPSIZE_END);
-  gtk_container_add (GTK_CONTAINER (message_area), priv->label);
-  gtk_widget_show (priv->label);
-
   priv->seq_context_id = 1;
   priv->seq_message_id = 1;
   priv->messages = NULL;
   priv->keys = NULL;
-}
-
-static GtkBuildableIface *parent_buildable_iface;
 
-static void
-gtk_statusbar_buildable_interface_init (GtkBuildableIface *iface)
-{
-  parent_buildable_iface = g_type_interface_peek_parent (iface);
-  iface->get_internal_child = gtk_statusbar_buildable_get_internal_child;
-}
+  gtk_widget_init_template (GTK_WIDGET (statusbar));
 
-static GObject *
-gtk_statusbar_buildable_get_internal_child (GtkBuildable *buildable,
-                                            GtkBuilder   *builder,
-                                            const gchar  *childname)
-{
-  GtkStatusbar *statusbar = GTK_STATUSBAR (buildable);
-  GtkStatusbarPrivate *priv = statusbar->priv;
-
-    if (strcmp (childname, "message_area") == 0)
-      return G_OBJECT (gtk_bin_get_child (GTK_BIN (priv->frame)));
-
-    return parent_buildable_iface->get_internal_child (buildable,
-                                                       builder,
-                                                       childname);
+  gtk_widget_set_redraw_on_allocate (GTK_WIDGET (statusbar), TRUE);
+  gtk_widget_style_get (GTK_WIDGET (statusbar), "shadow-type", &shadow_type, NULL);
+  gtk_frame_set_shadow_type (GTK_FRAME (priv->frame), shadow_type);
 }
 
 /**
@@ -580,7 +534,7 @@ gtk_statusbar_get_message_area (GtkStatusbar *statusbar)
 
   priv = statusbar->priv;
 
-  return gtk_bin_get_child (GTK_BIN (priv->frame));
+  return priv->message_area;
 }
 
 static void
diff --git a/gtk/gtkstatusbar.ui b/gtk/gtkstatusbar.ui
new file mode 100644 (file)
index 0000000..39bacbc
--- /dev/null
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface domain="gtk30">
+  <!-- interface-requires gtk+ 3.10 -->
+  <template class="GtkStatusbar" parent="GtkBox">
+    <property name="can_focus">False</property>
+    <property name="vexpand">False</property>
+    <property name="spacing">2</property>
+    <child>
+      <object class="GtkFrame" id="frame">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="label_xalign">0</property>
+        <property name="shadow_type">none</property>
+        <child>
+          <object class="GtkBox" id="message_area">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="spacing">4</property>
+            <child>
+              <object class="GtkLabel" id="label">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="halign">start</property>
+                <property name="valign">center</property>
+                <property name="ellipsize">end</property>
+                <property name="single_line_mode">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+          </object>
+        </child>
+        <child type="label_item">
+          <placeholder/>
+        </child>
+      </object>
+      <packing>
+        <property name="expand">True</property>
+        <property name="fill">True</property>
+        <property name="position">0</property>
+      </packing>
+    </child>
+    <child>
+      <placeholder/>
+    </child>
+  </template>
+</interface>
index 7cf7c63a8dfa96856a61ad8955cfd38c5900923b..15afa28b43a9b91e021890a1e4350057fe399ebe 100644 (file)
@@ -109,6 +109,16 @@ test_scale_button_basic (void)
   gtk_widget_destroy (widget);
 }
 
+static void
+test_statusbar_basic (void)
+{
+  GtkWidget *widget;
+
+  widget = gtk_statusbar_new ();
+  g_assert (GTK_IS_STATUSBAR (widget));
+  gtk_widget_destroy (widget);
+}
+
 int
 main (int argc, char **argv)
 {
@@ -129,6 +139,7 @@ main (int argc, char **argv)
   g_test_add_func ("/Template/GtkLockButton/Basic", test_lock_button_basic);
   g_test_add_func ("/Template/GtkAssistant/Basic", test_assistant_basic);
   g_test_add_func ("/Template/GtkScaleButton/Basic", test_scale_button_basic);
+  g_test_add_func ("/Template/GtkStatusBar/Basic", test_statusbar_basic);
 
   return g_test_run();
 }